package com.hspedu.qqserver.service;

import com.hspedu.qqcommon.Message;
import com.hspedu.qqcommon.MessageType;
import com.hspedu.qqcommon.User;

import javax.xml.crypto.Data;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;

/**
 * @author DL5O
 * @version 1.0
 * 这是一个服务端，在监听9999，等待客服端的链接，并保持通讯
 */
public class QQServer {

    private ServerSocket ss = null;
    private HashMap<String,User> userHM = new HashMap<>();
    private Message mes;
    private LocalDate ldt;//日期列
    private DateTimeFormatter dtf;

    public QQServer() {
        //注意端口可以卸载配置文件中去
        System.out.println("服务端在9999端口监听...");
        dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        try {
            ss = new ServerSocket(9999);
            while(true) { //当和某个客服端连接后，会一直监听
                Socket socket = ss.accept();//如果没有客服端连接，则会阻塞在这里
                //得到socket关联的对象输入流
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                User u = (User)ois.readObject();//第一次发过来是一个user对象，用于判断用户信息是否正确

                //得到一个输出流，进行回复
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                mes = new Message();
                //验证
                if(u.getUserId().equals("100") && u.getPassword().equals("123456")){//合法
                    //构建一个message对象，准备回复客服端
                    mes.setMesType(MessageType.MESSAGE_LOGIN_SUCCEED);
                    //创建一个线程和客服端保持通讯
                    oos.writeObject(mes);
                    ServerConnectClientThread scct= new
                            ServerConnectClientThread(socket, u.getUserId());
                    scct.run();
                    //放入管理线程进行管理
                    ManageServerConnectClientThread.addServerConnectClientThread(u.getUserId(),scct);
                }else{//登陆失败
                    System.out.println("用户 id=" +u.getUserId() + " pwd="+ u.getPassword()+ " 验证失败");
                    mes.setMesType(MessageType.MESSAGE_LOGIN_FAIL);
                    oos.writeObject(mes);
                    socket.close();//关闭socket
                }
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            //如果服务端退出了while循环，说明服务器端不再监听了，因此需要关闭资源
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
